2024年10月版 - AWS Tools for PowerShell V5の開発状況について

2024年10月版 - AWS Tools for PowerShell V5の開発状況について

Clock Icon2024.10.30

しばたです。

今年の8月にAWS SDK for .NETのメジャーバージョンアップとなるV4のプレビューリリースがあり、それに合わせてAWS Tools for PowerShellのメジャーバージョンアップとなるV5の開発方針もアナウンスされました。

https://aws.amazon.com/jp/blogs/developer/preview-1-of-aws-sdk-for-net-v4/

https://aws.amazon.com/jp/blogs/developer/notice-of-upcoming-major-version-5-of-aws-tools-for-powershell/

その後、今月に入り最初のプレビューリリースとなる AWS Tools for PowerShell Ver.5.0.0-preview001 がリリースされたので現在の状況を共有したいと思います。

AWS Tools for PowerShell V5の開発方針

前掲のブログにある通りAWS Tools for PowerShell V5はAWS SDK .NET V4をベースにして実装されます。
(現行のAWS Tools for PowerShell V4はAWS SDK .NET V3ベース)

リリース時期に関してはAWS SDK .NET V4のリリース予定がまだ未定のため、AWS Tools for PowerShell V5のリリース予定も未定となっています。

現時点では以下で説明する破壊的変更が入る予定となっており、AWS SDK .NET V4の破壊的変更に起因するものとAWS Tools for PowerShell独自判断によるものそれぞれ存在しています。

1. サポート対象となるPowerShellのバージョン

現行のAWS Tools for PowerShellは

  • AWSPowerShell モジュール
  • AWSPowerShell.NetCore モジュール
  • サービス毎の AWS.Tools.* なモジュール

の3種類ありますが、このうちAWSPowerShellモジュールがPowerShell 5.1のみのサポートに変わる予定です。
(現在はPowerShell 3.0 ~ 5.1のサポート)

これはAWS SDK .NET V4が.NET Framework 4.7.2以降のみのサポートになるのを受けての事ですが、本日時点でサポートされているWindowsクライアントおよびWindows Serverは全てPowerShell 5.1環境しかない点も含まれていると思います。

AWSのブログではAWSPowerShell.NetCoreモジュールについては一切触れられていませんでしたが、こちらも同様にサポートバージョンが引き上げられるのではと予想します。

2. null許容型プロパティの扱い

AWS SDK for .NET V4から各種クラスのプロパティをnull許容型で扱う様になり、AWS Tools for PowerShell V5においてもこの変更がそのまま引き継がれます。

一例を出すと、EC2インスタンスの情報を取得するGet-EC2Instanceコマンドレットの戻り値の一部はAWS SDK for .NETのAmazon.EC2.Model.Instanceクラスになります。[1]
このクラスにあるEbsOptimizedプロパティはAWS SDK for .NET V3まではSystem.Boolean型ですが、V4からSystem.Nullable<System.Boolean>型になり、AWS Tools for PowerShellにおいてもBooleanNullable<Boolean>型への変更が発生します。

AWS Tools for PowerShellでは多くの場合においてAWS SDK for .NETのクラスをそのまま利用しているので当然と言えば当然の挙動です。

ただ、スクリプト言語であるPowerShellは元々当たり前にnullを許容しており、null許容型と元の型を透過的に変換します。
このため基本的な利用においてこの変更は無視できるはずです。

プロパティの型を取得して何らかの条件判定をしている様なケースにおいては処理の見直しが必要になることがあります。

3. コレクション初期値の扱い

AWS SDK for .NET V4では不要なメモリアロケーションを減らすことを目的として、List型とDictionary型プロパティの初期値が空のコレクションからnullに変更されます。
前項同様AWS Tools for PowerShellにおいても空コレクションnullへの変更が発生します。

こちらは非常に影響範囲の大きい破壊的変更なのでAWS SDK for .NETでは後方互換用の設定が用意されているのですが、AWS Tools for PowerShellでどうなるかは明記されていません。
AWSブログでは

Some cmdlet output will change to return $null instead of empty collections.

とあり、後方互換のための設定は用意されない予感がします...

4. $AWSHistory変数の廃止

次に、AWS Tools for PowerShell V5ではコマンドレットの実行履歴やレスポンス内容の履歴を保存していた$AWSHistory変数が廃止されます。

これはAWS Tools for PowerShell V4で導入された-Selectパラメーターによって導入当初の目的を代替できるという判断からの決定です。

5. AWS_PROFILE環境変数のサポート

最後にAWS Tools for PowerShell V5ではAWS CLIと同様にAWS_PROFILE環境変数から利用するプロファイルを選べる様になります。

こちらはシンプルな内容ですが非常に嬉しい改善です。

AWS Tools for PowerShell Ver.5.0.0-preview001

ブログのアナウンスと同時期にGitHub上にも開発状況を共有するためのIssueが公開されました。

https://github.com/aws/aws-tools-for-powershell/issues/357

その後、今月下旬に最初のプレビュー版となるVer.5.0.0-preview001のリリースがアナウンスされています。

このバージョンでは

  • AWSPowerShellモジュールのサポートバージョンを変更 (PowerShell 5.1のみに)
  • AWS SDK for .NET V4の利用によるnull許容型の利用とコレクション初期値null化の適用
  • $AWSHistory変数を削除
  • 一部コマンドから使われなくなった-PassThruパラメーターを削除
  • 従来のDynamoDBモジュールからDynamoDB Stream関連の機能を分離
    • AWS CLIの構成と近い形にした模様
  • S3モジュールにいくつかのコマンドレットを追加
    • AWS SDK for .NET V4でサポートされた追加API分を実装

といった更新が加えられています。
残念ながらAWS_PROFILE環境変数のサポートはまだでした。

プレビュー版ですので本番環境での利用は非推奨です。
また、モジュールのオートロードが出来ない様で、明示的に共通機能となるAWS.Tools.Commonモジュールのインポートが必要でした。

動作確認

ここからは簡単に動作確認しておきます。

手っ取り早く使い捨ての環境を用意したかったので今回はAWS CloudShellを使うことにしました。
本日時点でCloudShell上のPowerShellはVer.7.4.5です。

CloudShellにはデフォルトでAWS Tools for PowerShell V4がインストール済みなので、Bash上で以下のコマンドを実行し既存のモジュールを全て削除しておきます。

Bash
# あらかじめCloudShellにデフォルトインストール済みのモジュールを削除
sudo rm -rf /opt/microsoft/powershell/7/Modules/AWS.Tools.*

この状態でPowerShellを起動し、AWS関連のモジュールが無くなっていることを確認しておきます。

PowerShell
# AWS関連のモジュールが無いことを確認
PS /> Get-Module -ListAvailable -Name AWS*
PS /> 
PS /> Get-InstalledModule                 
PS /> 

モジュールのインストール

AWS Tools for PowerShell Ver.5.0.0-preview001はPowerShell Galleryに登録済みですのでInstall-Moduleコマンドを使い各種モジュールをインストールします。

今回はGitHubの手順に追加でAWS.Tools.EC2モジュールもインストールしてみました。
なお、現時点ではAWS.Tools.Installerを使ったインストールだと不具合があるとのことでした。

PowerShell
# プレビュー版なので -AllowPrerelease を付けてインストールする
Install-Module -Name AWS.Tools.Common -AllowPrerelease -Repository PSGallery -Force
Install-Module -Name AWS.Tools.S3 -AllowPrerelease -Repository PSGallery -Force
Install-Module -Name AWS.Tools.EC2 -AllowPrerelease -Repository PSGallery -Force

エラー無く処理が終わればOKで、結果は以下の通りです。

PowerShell
PS /> Get-InstalledModule | Format-Table -AutoSize

Version          Name             Repository Description
-------          ----             ---------- -----------
5.0.0-preview001 AWS.Tools.EC2    PSGallery  The EC2 module of AWS Tools for PowerShell …
5.0.0-preview001 AWS.Tools.Common PSGallery  The AWS Tools for PowerShell lets developer…
5.0.0-preview001 AWS.Tools.S3     PSGallery  The S3 module of AWS Tools for PowerShell l…

モジュールの利用

現時点ではモジュールを利用する際はAWS.Tools.Commonを明示的にインポートする必要があります。
たとえば先にAWS.Tools.EC2モジュールをインポートしようとすると次のエラーとなってしまいます。

PowerShell
# AWS.Tools.Common をインポートしない場合に発生するエラー
PS /> Import-Module -Name AWS.Tools.EC2                                               
Import-Module: Could not load file or assembly 'AWS.Tools.Common, Version=5.0.0.0, Culture=neutral, PublicKeyToken=f3c454fc91f52a42'. The system cannot find the file specified.

このためAWS.Tools.Commonその他モジュール の順にインポートしてください。
(ちなみにAWS.Tools.Commonのインポートだけで済む場合が多いです)

PowerShell
# 利用するモジュールを適宜インポートする
Import-Module -Name AWS.Tools.Common
Import-Module -Name AWS.Tools.S3
Import-Module -Name AWS.Tools.EC2

あとは従来通りの利用をするだけです。

PowerShell
# EC2インスタンスの一覧を取得
PS /> Get-EC2Instance -Select Reservations.Instances

InstanceId          InstanceType Platform PrivateIpAddress PublicIpAddress SecurityGroups
----------          ------------ -------- ---------------- --------------- --------------
i-099afd9xxxxxxxxxx t4g.micro             10.0.11.xxx                      {xxxxxxxxxxxx…
i-03daa1cxxxxxxxxxx t2.micro              10.0.21.xxx                      {xxxxxxxxxxxx…
i-045518xxxxxxxxxxx t3.small     Windows  10.0.11.xxx                      {xxxxxxxxxxxx…
i-0d6c4dxxxxxxxxxxx t3.small              10.0.11.xxx                      {xxxxxxxxxxxx…

前節で解説した通り、戻り値のプロパティの型がnull許容型(System.Nullable[T])になっています。

PowerShell
# 一部プロパティの型がnull許容型 (System.Nullable[bool] など) になっている
PS /> Get-EC2Instance -Select Reservations.Instances | Get-Member

   TypeName: Amazon.EC2.Model.Instance

Name                                    MemberType Definition
----                                    ---------- ----------
Equals                                  Method     bool Equals(System.Object obj)
GetHashCode                             Method     int GetHashCode()
GetType                                 Method     type GetType()
ToString                                Method     string ToString()
AmiLaunchIndex                          Property   System.Nullable[int] AmiLaunchIndex {#
# ・・・省略・・・
#
EbsOptimized                            Property   System.Nullable[bool] EbsOptimized {g…
#
# ・・・省略・・・
#
TpmSupport                              Property   string TpmSupport {get;set;}
UsageOperation                          Property   string UsageOperation {get;set;}
UsageOperationUpdateTime                Property   System.Nullable[datetime] UsageOperat…
VirtualizationType                      Property   Amazon.EC2.VirtualizationType Virtual…
VpcId                                   Property   string VpcId {get;set;}

とはいえPowerShellではnull許容型を意識せずそのまま扱えます。

PowerShell
# PowerShellにおいてnull許容型は透過的に処理される
PS /> $instance = Get-EC2Instance -Select Reservations.Instances | Select-Object -First 1
PS /> $instance.EbsOptimized                                                             
True

# プロパティの型を直接取得しようとしても System.Nullable[bool] ではなく System.Boolean になる
PS /> $instance.EbsOptimized | Get-Member

   TypeName: System.Boolean
#
# ・・・後略・・・
#

また、戻り値のうちコレクションとなるプロパティを適当に選ぶと確かに$nullが返されました。

PowerShell
# ElasticGpuAssociations プロパティの初期値が確かにnullになっている
PS /> $null -eq $instance.ElasticGpuAssociations
True
# 値が無いので GetType() メソッドは失敗する
PS /> $instance.ElasticGpuAssociations.GetType()
InvalidOperation: You cannot call a method on a null-valued expression.

# 比較用 : AWS Tools for PowerShell V4では空コレクションが初期値
PS /> $null -eq $instance.ElasticGpuAssociations
False
# 値があるので GetType() メソッドが成功し型情報を取れる
PS /> $instance.ElasticGpuAssociations.GetType()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     List`1                                   System.Object

PowerShellにおいて空コレクションの扱いは結構なクセがあり、個人的にはnullになってくれる方がまだ直感的に扱えると思うものの、これはかなり大きい破壊的変更なので要注意ですね。

そして各種コマンドを実行しても$AWSHistory変数は現れず確かに削除済みでした。

PowerShell
# AWSHistory 変数は削除済み
PS /> dir variable:AWS*
PS /> 

余談

今回は試しませんが、AWSPowerShellモジュール、AWSPowerShell.NetCoreモジュールもプレビュー版がリリースされています。

EC2上でAWS Tools for PowerShellをご利用の方はAWSPowerShellモジュールを使った検証を行っておくと良いかもしれません。

最後に

以上となります。

最初のプレビュー版がリリースされたばかりであり、まだ将来的にどうなるか未知数なところがあります。
今後も情報を追っていきますので何かあればブログでお伝えしたいと思います。

脚注
  1. 直接の戻り値は Amazon.EC2.Model.Reservation クラス ↩︎

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.